package com.gopay.cashier.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.criterion.DetachedCriteria;

import com.gopay.common.base.dao.BaseDAO;

public interface CommonDAO<T extends Serializable, Pk extends Serializable> extends BaseDAO<T, Pk> {
    /**
     * @return - 实体T的类名
     */
    String getEntityName();

    /**
     * 删除实体数据
     * 
     * @param entity
     */
    void delete(T entity);

    /**
     * 删除结合对象
     * 
     * @param collection
     */
    void deleteAll(Collection<T> collection);

    /**
     * 修改实体数据
     * 
     * @param entity
     */
    void update(T entity);

    /**
     * 通过实例属性查询
     * 
     * @param entity
     */
    List<T> findByExample(T entity);

    /**
     * 查找数据
     * 
     * @param id
     *            主键
     * @return
     */
    T find(Class<T> entity, Pk id);

    /**
     * 基于criteria的查询
     * 
     * @param criteria
     * @return
     */
    List<T> findByCriteria(DetachedCriteria criteria);

    /**
     * 基于criteria的查询
     * 
     * @param criteria
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<T> findByCriteria(DetachedCriteria criteria, int pageNo, int pageSize);

    /**
     * 基于criteria的查询记录总数
     * 
     * @param criteria
     * @return
     */
    int findCountByCriteria(DetachedCriteria criteria);

    /**
     * 通过SQLScalar查询
     * 
     * @param sql
     * @param scalarSet
     * @return
     */
    List<T> findBySqlScalar(final String sql, final Set<String> scalarSet);

    /**
     * 通过SQLScalar查询
     * 
     * @param sql
     * @param pageNo
     * @param pageSize
     * @param scalarSet
     * @return
     */
    List<T> findBySqlScalar(final String sql, final int pageNo, final int pageSize, final Set<String> scalarSet);

    /**
     * 查询T表所有数据
     * 
     * @param entityClass
     * @return
     */
    List<T> findAll(Class<T> entityClass);

    /**
     * 通过HQL查询
     * 
     * @param hql
     * @param param
     * @return
     */
    List<T> findByHql(final String hql, final Map<String, Object> param);

    /**
     * 通过HQL查询
     * 
     * @param hql
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    List<T> findByHql(final String hql, final Map<String, Object> param, final int pageIndex, final int pageSize);

    /**
     * 通过HQL删除
     * 
     * @param hql
     * @return
     */
    int deleteByHql(final String hql);

    /**
     * 通过SQL查询
     * 
     * @param sql
     * @return
     */
    List<T> findBySql(final String sql);

    /**
     * 通过SQL查询
     * 
     * @param sql
     * @param param
     * @return
     */
    List<T> findBySql(final String sql, final Map<String, Object> param);

    /**
     * 通过SQL查询
     * 
     * @param sql
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<T> findBySql(final String sql, final int pageNo, final int pageSize);

    /**
     * 通过SQL查询
     * 
     * @param sql
     * @param param
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<T> findBySql(final String sql, final Map<String, Object> param, final int pageNo, final int pageSize);

    T get(Pk id);

}
